package com.mlh.springboot.config;

import com.mlh.springboot.bean.Cat;
import com.mlh.springboot.bean.Dog;
import com.mlh.springboot.bean.Monster;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * @author 缪林辉
 * @date 2024/2/28 20:16
 * @DESCRIPTION
 */

// 1. @Configuration标识这是一个配置类，等价于配置文件
// 2.程序员可以通过@Bean 注解注入bean对象到容器

// * 1. proxyBeanMethods：代理 bean 的方法
// * (1) Full(proxyBeanMethods = true)、【保证每个@Bean 方法被调用多少次返回的组件都是单实例的, 是代理方式
// * (2) Lite(proxyBeanMethods = false)【每个@Bean 方法被调用多少次返回的组件都是新创建的, 是非代理方式
// * (3) 特别说明: proxyBeanMethods 是在 调用@Bean 方法 才生效，因此，需要先获取BeanConfig 组件，再调用方法
// * 而不是直接通过 SpringBoot 主程序得到的容器来获取 bean, 注意观察直接通过ioc.getBean() 获取 Bean,
// proxyBeanMethods 值并没有生效
// * (4) 如何选择: 组件依赖必须使用 Full 模式默认。如果不需要组件依赖使用 Lite 模
// * (5) Lite 模 也称为轻量级模式，因为不检测依赖关系，运行速度快
//1. @Import代码可以看到，可以指定class的数组，可以注入指定类型的Bean
// public @interface Import {
// Class<?>[] value()
// }
// 2.通过@Import方式注入了组件，默认组件名字/id就是对应类型的全类名
@Import({Dog.class, Cat.class})
@Configuration(proxyBeanMethods = true)
public class BeanConfig {
    // 1. @Bean :给容器添加组件，就是Monster bean
    // 2. monster01() :默认你的方法名monster01 作为Bean的名字/id
    // 3. 返回类型 Monster:表示注入类型，注入bean的类型是Monster
    // 4. new Monster(200, "牛魔王" , 500,“疯魔拳")注入到容器中具体的Bean信息
    // 5. @Bean(name = "monster_nmw") :在注入Bean指定名字/id
    // 6.默认是单例
    //如果想变成多例  加上@Scope("prototype") 即可
    @Bean
    public Monster monster01(){
        return new Monster(200, "牛魔王" , 500, "疯魔拳");
    }
}
